program virtual_class;

virtual class BaseTransaction;
    // 属性
    int id;

    // 构造函数
    function new(int id = 0);
        this.id = id;
    endfunction
  
    // 虚方法 - 有默认实现
    virtual function void display();
        $display("BaseTransaction: id = %0d", id);
    endfunction
    
    // 纯虚方法 - 必须由子类实现
    pure virtual function int calculate_delay();
endclass


class MemoryTransaction extends BaseTransaction;
    // 子类特有属性
    bit [31:0] address;
    bit [31:0] data;
    
    // 子类构造函数
    function new(int id = 0, bit [31:0] addr = 0, bit [31:0] d = 0);
        super.new(id);  // 调用父类构造函数
        this.address = addr;
        this.data = d;
    endfunction
    
    // 重写虚方法
    virtual function void display();
        $display("MemoryTransaction: id = %0d, address = 0x%0h, data = 0x%0h", 
                id, address, data);
    endfunction
    
    // 实现纯虚方法
    virtual function int calculate_delay();
        // 基于地址计算延迟
        return (address[9:0] % 10) + 5;
    endfunction
endclass

initial begin
    // 错误 - 不能实例化virtual class
    // BaseTransaction base = new();  // 这会导致编译错误
    
    // 正确 - 实例化派生类
    MemoryTransaction mem_trans = new(1, 'h1000, 'hABCD);
    
    // 使用基类引用指向子类对象 - 多态性
    BaseTransaction base_ref;
    base_ref = mem_trans;
    
    // 调用方法
    mem_trans.display();  // 调用子类实现
    base_ref.display();   // 通过基类引用调用子类重写的方法
    
    // 调用纯虚方法的实现
    $display("Delay = %0d", base_ref.calculate_delay());
end

endprogram
